﻿#pragma once
#include "XyNet/Common/SharedObject.h"
#include <boost/uuid/uuid.hpp>

namespace XyNet
{
	typedef int64_t Id;

	/// 序列ID生成器（线程安全）
	class XYNET_API IdGenerator : noncopyable
	{
	public:
		IdGenerator();

		/// 重新计算id
		void reset();

		/// 生成ID
		Id operator()();

	private:
		/// 0作为空ID。因为生成id函数是个原子操作，不能用atomic类型
		SharedObject<Id> _idCountObject;
	};

	//////////////////////////////////////////////////////////////////////////

	/// uuid
	class XYNET_API Uuid
	{
	public:
		/// 创建空uuid
		Uuid();
		/// 用boost::uuid创建
		Uuid(const boost::uuids::uuid& uuid);
		/// 用字节串或字符串创建UUID
		Uuid(const string& bytesOrString);

		inline bool operator==(const Uuid& uuid) const { return _uuid == uuid._uuid; }

		/// Uuid是否全为0
		inline bool isNil() const { return _uuid.is_nil(); }

		/// 以字节向量形式输出
		Bytes toBytes() const;
		/// 以标准字符串形式输出，如XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
		string toString(bool uppercase = true) const;
		/// 以十六进制字符串形式输出
		string toHex(bool uppercase = true) const;
		/// 以base64字符串形式输出
		string toBase64() const;

		/// 生成随机UUID
		static Uuid makeRandomUuid();

	private:
		boost::uuids::uuid _uuid;

#ifdef _DEBUG		
		string _uuidString;	// 调试时显示可读字符串
#endif
	};
}